package dao

import (
	"lib/structs/enum"
	"lib/structs/tables"
)

// 客户端数据库操作不多，写一起算了

var ClientAmsDao = new(clientAmsDao)

type clientAmsDao struct {
}

func (d clientAmsDao) ExecSql(sqlStr string) (err error) {
	err = DB.Exec(sqlStr).Error
	return
}

func (d clientAmsDao) SaveConfig(m tables.ClientAmsConfig) (err error) {
	err = DB.Save(&m).Error
	return
}

func (d clientAmsDao) FindConfigAll() (li []tables.ClientAmsConfig, err error) {
	err = DB.Find(&li).Error
	return
}

func (d clientAmsDao) FindConfigByKey(key string) (val string, err error) {
	var m tables.ClientAmsConfig
	err = DB.Where(&tables.ClientAmsConfig{Key: key}).First(&m).Error
	val = m.Val
	return
}

func (d clientAmsDao) CreateLog(m tables.ClientAmsLog) (err error) {
	m.Ack = enum.No
	err = DB.Create(&m).Error
	if err != nil {
		return err
	}
	LogMapCache.Store(m.Id, m)
	return
}

func (d clientAmsDao) AckLog(id int64) (err error) {
	err = DB.Model(&tables.ClientAmsLog{}).Where("id = ?", id).Update("ack", enum.Yes).Error
	if err != nil {
		return
	}
	LogMapCache.Delete(id)
	return
}

// FindLastLogByLogCode 查询某个类型的结果的最后一条数据
func (d clientAmsDao) FindLastLogByLogCode(logCode string) (m tables.ClientAmsLog, err error) {
	err = DB.Where("log_code = ?", logCode).Order("id desc").Limit(1).Find(&m).Error
	return
}

func (d clientAmsDao) SavePolicy(m tables.ClientAmsPolicy) (err error) {
	var m1 tables.ClientAmsPolicy
	if err = DB.Where("id = ?", m.Id).Find(&m1).Error; err != nil {
		return err
	}
	if m1.Id == 0 {
		if err = DB.Create(&m).Error; err != nil {
			return err
		}
	} else {
		if err = DB.Updates(&m).Error; err != nil {
			return err
		}
	}
	PolicyMap.Range(func(key, value interface{}) bool {
		pol := key.(tables.ClientAmsPolicy)
		if pol.Id == m1.Id {
			PolicyMap.Delete(pol)
		}
		return true
	})
	PolicyMap.Store(m, 0)
	return
}
func (d clientAmsDao) DelPolicy(m tables.ClientAmsPolicy) (err error) {
	if err = DB.Delete(&m).Error; err != nil {
		return
	}
	PolicyMap.Delete(m)
	return
}

func (d clientAmsDao) FindPolicyAll() (li []tables.ClientAmsPolicy, err error) {
	err = DB.Find(&li).Error
	return
}
